package com.smartboot.plus.service;

import com.smartboot.plus.condition.ConditionGroup;
import com.smartboot.plus.condition.ConditionQ;
import com.smartboot.plus.exception.ServiceException;
import com.smartboot.plus.ignite.IgniteCacheRegion;
import com.smartboot.plus.ignite.IgniteQueryExecutor;
import com.smartboot.plus.ignite.cache.MqttClientCache;
import com.smartboot.plus.page.IPage;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import tech.smartboot.feat.cloud.annotation.Autowired;
import tech.smartboot.feat.cloud.annotation.Bean;

/**
 * MQTT客户端服务类，负责管理MQTT客户端的连接、断开及查询操作。
 */
@Bean
public class MqttClientService implements IgniteQueryExecutor<MqttClientCache> {

    @Autowired
    private Ignite igniteInstance;


    @Autowired
    private MqttMessageService mqttMessageService;



    /**
     * 获取用于存储MQTT客户端信息的Ignite缓存实例。
     *
     * @return 返回指定名称的Ignite缓存实例。
     */
    @Override
    public IgniteCache<String, MqttClientCache> getIgniteCache() {

        return igniteInstance.cache(IgniteCacheRegion.MQTT_CLIENT_CACHE.getCacheName());
    }

    /**
     * 根据给定的分页参数、客户端ID和用户名查询符合条件的MQTT客户端列表。
     *
     * @param page      分页对象，包含当前页码和每页大小。
     * @param clientId  客户端ID，可以为空表示不过滤该字段。
     * @param username  用户名，可以为空表示不过滤该字段。
     * @return 返回一个包含分页结果的IPage对象。
     */
    public IPage<MqttClientCache> selectPage(IPage<MqttClientCache> page, String clientId, String username) {
        try {
            // 构建查询条件组
            ConditionGroup conditionGroup = new ConditionGroup()
                    .add(ConditionQ.like(MqttClientCache::getUsername, username)
                            .and(new ConditionQ(MqttClientCache::getClientId, clientId)));

            // 执行查询并返回结果
            return this.selectPage(page, conditionGroup, MqttClientCache.class);
        } catch (Exception e) {
            // 捕获异常并抛出服务异常
            throw new ServiceException("Failed to query MQTT clients: " + e.getMessage());
        }
    }

    /**
     * 断开指定客户端ID的连接，并从缓存中移除该客户端的信息。
     *
     * @param clientId 要断开连接的客户端ID。
     * @return 如果成功断开连接并移除客户端信息，则返回true；否则返回false。
     */
    public boolean disconnection(String clientId) {
        try {
            // 发送断开消息到指定主题
            mqttMessageService.getCacheGroup().ignite().message().send("disconnectTopic", clientId);

            // 从缓存中移除客户端信息
            this.removeById(clientId);

            return true;
        } catch (Exception e) {
            // 捕获异常并抛出服务异常
            throw new ServiceException("Failed to disconnect client: " + clientId + ", Error: " + e.getMessage());
        }
    }


}